// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLExprImpl;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.ast.SQLReplaceable;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.List;
#pragma once
#include <string>
#include <list>
#include "../SQLExprImpl.h"
#include "../SQLReplaceable.h"

class SQLMatchAgainstExpr_SearchModifier
{
public:
  static SQLMatchAgainstExpr_SearchModifier IN_BOOLEAN_MODE;
  static SQLMatchAgainstExpr_SearchModifier IN_NATURAL_LANGUAGE_MODE;
  static SQLMatchAgainstExpr_SearchModifier IN_NATURAL_LANGUAGE_MODE_WITH_QUERY_EXPANSION;
  static SQLMatchAgainstExpr_SearchModifier WITH_QUERY_EXPANSION;

  string_ptr  name;
  string_ptr  nameLCase;
  uint64_t mask;

  SQLMatchAgainstExpr_SearchModifier();

  SQLMatchAgainstExpr_SearchModifier(uint64_t mask, string_ptr  name);
};

class SQLMatchAgainstExpr : public SQLExprImpl, virtual public SQLReplaceable
{
public:
  SQLExpr_list_ptr  columns;
  SQLExpr_ptr against;
  std::shared_ptr<SQLMatchAgainstExpr_SearchModifier> searchModifier;

  SQLMatchAgainstExpr();
  SHAREDOBJECT(SQLMatchAgainstExpr);

  virtual SQLObject_ptr clone();

  //@Override
  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  SQLExpr_list_ptr  getColumns();

  void setColumns(SQLExpr_list_ptr  columns);

  SQLExpr_ptr getAgainst();

  void setAgainst(SQLExpr_ptr against);

  std::shared_ptr<SQLMatchAgainstExpr_SearchModifier> getSearchModifier();

  void setSearchModifier(std::shared_ptr<SQLMatchAgainstExpr_SearchModifier> searchModifier);

  //@Override
  void accept0(SQLASTVisitor_ptr v);

  //@Override
  SQLObject_list_ptr  getChildren();

  //@Override
  int hashCode();

  //@Override
  bool equals(Object_ptr obj);
};
